package com.librelato.tela;

import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

import org.primefaces.context.RequestContext;
import org.primefaces.event.SelectEvent;

import com.librelato.bean.CondicaoPagamentoBean;
import com.librelato.bean.EmpresaBean;
import com.librelato.bean.FornecedorBean;
import com.librelato.bean.NotaFiscalEntradaBean;
import com.librelato.bean.PedidoBean;
import com.librelato.bean.ProdutoBean;
import com.librelato.bean.SolicitacaoBean;
import com.librelato.bean.TabelaPrecoBean;
import com.librelato.bean.TransportadoraBean;
import com.librelato.bean.UsuarioBean;
import com.librelato.negocio.CondicaoPagamentoServico;
import com.librelato.negocio.FornecedorServico;
import com.librelato.negocio.NotaFiscalEntradaServico;
import com.librelato.negocio.PedidoServico;
import com.librelato.negocio.ProdutoServico;
import com.librelato.negocio.SolicitacaoServico;
import com.librelato.negocio.TabelaPrecoServico;
import com.librelato.negocio.TransportadoraServico;
import com.librelato.negocio.interfaces.IServicoGenerico;
import com.librelato.tela.datamodel.ProdutoDataModel;
import com.librelato.tela.datamodel.SolicitacaoDataModel;
import com.librelato.util.Ferramentas;
import com.librelato.webservices.DadosPedido;
import com.librelato.webservices.ListaPedido;
import com.librelato.webservices.WsSoapStubPedido;

@ManagedBean
@ViewScoped
public class GeraPedidoTela extends TelaAbstrata {

	@ManagedProperty(value = "#{usuario}")
	private UsuarioBean usuario;

	private PedidoServico<PedidoBean> pedidoServico;

	private SolicitacaoServico<SolicitacaoBean> solicitacaoServico;

	private ProdutoServico<ProdutoBean> produtoServico;

	private String dataDe;

	private String dataAte;

	private String numSolicitacao;

	private String codProd;

	private String filial;

	private Map<String, String> parametros;

	private List<SolicitacaoBean> listaSolicitacao;

	private List<ProdutoBean> itensSolicitacao;

	private SolicitacaoDataModel listaSolicitacaoModel;

	private SolicitacaoDataModel listaSolicitacaoPedidoModel;

	private SolicitacaoBean solicitacao;

	private SolicitacaoBean[] solicitacoesPreSelecionadas;

	private SolicitacaoBean[] solicitacoesSelecionadasPedido;

	private PedidoBean pedido;

	private boolean valFreteReadOnly;

	private String numPedido;

	private FornecedorBean fornecedorSel;
	
	private FornecedorBean fornecedorSel2;

	private CondicaoPagamentoBean condicaoPagSel;

	private TransportadoraBean transportadoraSel;

	private String codLojaFornecedor;

	private String analiseProdutoHtml;

	private String consumoUltimosMesesHtml;

	private NotaFiscalEntradaServico<NotaFiscalEntradaBean> notaFiscalServico;

	private List<NotaFiscalEntradaBean> listaUltimasNotasProduto;

	private boolean checkEnviaEmail;
	
	private ProdutoBean produtoSel;
	
	private ProdutoBean[] itensSelecionados;
	
	private ProdutoDataModel itensSolicitacaoBloquear;

	public GeraPedidoTela() {
		usuario = usuario == null ? (UsuarioBean) ((HttpSession) FacesContext
				.getCurrentInstance().getExternalContext().getSession(false))
				.getAttribute("usuario") : usuario;
		pedidoServico = new PedidoServico<PedidoBean>();
		solicitacaoServico = new SolicitacaoServico<SolicitacaoBean>();
		solicitacao = new SolicitacaoBean();
		pedido = new PedidoBean();
		pedido.setFornecedor(new FornecedorBean());
		pedido.setCondPag(new CondicaoPagamentoBean());
		pedido.setTransportadora(new TransportadoraBean());
		valFreteReadOnly = true;

	}

	public void filtraSolicitacaoComprador() {
		try {
			parametros = new HashMap<String, String>();
			if (dataDe != null && !"".equals(dataDe.trim())) {
				parametros.put("DATADE", dataDe);
			}
			if (dataAte != null && !"".equals(dataAte.trim())) {
				parametros.put("DATAATE", dataAte);
			}
			if (codProd != null && !"".equals(codProd.trim())) {
				parametros.put("PRODUTO", codProd);
			}
			if (numSolicitacao != null && !"".equals(numSolicitacao.trim())) {
				parametros.put("NUMSOL", numSolicitacao);
			}
			if (filial != null && !"".equals(filial.trim())) {
				parametros.put("FILIAL", filial);
			}

			listaSolicitacao = this.solicitacaoServico
					.buscaSolicitacaoComprador("Aprovado", usuario, parametros);
			listaSolicitacaoModel = new SolicitacaoDataModel(listaSolicitacao);
			solicitacoesPreSelecionadas = null;
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public String pintaLinhaBusca(String produto) {
		String corLinha = "";
		if (codProd != null && !"".equals(codProd.trim())
				&& codProd.trim().equals(produto.trim())) {
			corLinha = "LinhaBusca";
		}
		return corLinha;
	}
	public void geraPedido() {
		if (solicitacoesSelecionadasPedido != null
				&& solicitacoesSelecionadasPedido.length != 0) {
			try {
				pedido.setSolicitacoesPedido(Arrays
						.asList(this.solicitacoesSelecionadasPedido));
				pedido.setComprador(usuario.getComprador());
				pedido.setDtEmissao(new Date());
				// pedido.setDtEntrega(dtEntrega)
				pedido.setEmpresa(new EmpresaBean(filial, null));

				WsSoapStubPedido stubPedido = new WsSoapStubPedido();
				DadosPedido dadosPedido;
				List<DadosPedido> listaDadosPedido = new ArrayList<DadosPedido>();
				for (int i = 0; i < solicitacoesSelecionadasPedido.length; i++) {
					dadosPedido = new DadosPedido();
					dadosPedido.setArma(solicitacoesSelecionadasPedido[i]
							.getItensSolicitacao().get(0).getLocal());
					dadosPedido.setCc(solicitacoesSelecionadasPedido[i]
							.getItensSolicitacao().get(0).getCentroCusto()
							.getCodigo().trim());
					dadosPedido.setComprador(pedido.getComprador()
							.getCodCompMicro().trim());
					dadosPedido.setCond(pedido.getCondPag().getCodigo());
					dadosPedido.setContato(pedido.getFornecedor().getContato().trim());
					dadosPedido.setFilial(solicitacoesSelecionadasPedido[i]
							.getFilial());
					dadosPedido.setFornece(pedido.getFornecedor().getCodigo());
					dadosPedido.setIdUser(Long.parseLong(usuario.getCodigo()));
					dadosPedido.setItemSc(solicitacoesSelecionadasPedido[i]
							.getItem());
					dadosPedido
							.setLoja(pedido.getFornecedor().getLoja().trim());
					dadosPedido.setNumSc(solicitacoesSelecionadasPedido[i]
							.getNumSolicitacao());
					dadosPedido.setNUser(usuario.getNome());
					dadosPedido.setObs(solicitacoesSelecionadasPedido[i]
							.getItensSolicitacao().get(0).getObservacao().trim());
					dadosPedido.setPreco(solicitacoesSelecionadasPedido[i]
							.getItensSolicitacao().get(0).getPreco());
					dadosPedido.setProd(solicitacoesSelecionadasPedido[i]
							.getItensSolicitacao().get(0).getCodigo());
					dadosPedido.setProDesc(solicitacoesSelecionadasPedido[i]
							.getItensSolicitacao().get(0).getDescricao().trim());
					dadosPedido.setQuant(solicitacoesSelecionadasPedido[i]
							.getItensSolicitacao().get(0).getQuantidade());
					dadosPedido.setTransp(pedido.getTransportadora()
							.getCodigo().trim());
					dadosPedido.setValIpi(solicitacoesSelecionadasPedido[i]
							.getItensSolicitacao().get(0).getIpi());
					dadosPedido.setpIcm(solicitacoesSelecionadasPedido[i]
							.getItensSolicitacao().get(0).getIcms());
					dadosPedido.setCodMicros(usuario.getCodMicrosiga());
					dadosPedido.setValFrete(0.00);
					dadosPedido.setTpFrete(pedido.getTipoFrete());
					dadosPedido.setDtNece(solicitacoesSelecionadasPedido[i]
							.getItensSolicitacao().get(0).getNecessidade());
					dadosPedido.setUniReq(solicitacoesSelecionadasPedido[i].getUnidadeRequisi().getCodigo());

					listaDadosPedido.add(dadosPedido);
				}
				DadosPedido[] vetorPedido = listaDadosPedido
						.toArray(new DadosPedido[listaDadosPedido.size()]);
				ListaPedido listaPedido = new ListaPedido(vetorPedido);
				String b = stubPedido.incluiPed(listaPedido);

				numPedido = b;
				if (numPedido.trim().length() <= 6) {
					usuario.setUltimaSolicitacao(numPedido.trim());
					RequestContext.getCurrentInstance().addPartialUpdateTarget(
							"dlgSucessoPedido");
					RequestContext.getCurrentInstance().execute(
							"dlgSucessoPedido.show()");
					RequestContext.getCurrentInstance().execute(
							"dlgGeraPedido.hide()");
					filtraSolicitacaoComprador();
					RequestContext.getCurrentInstance().addPartialUpdateTarget(
							":formGeraPed");
					if (checkEnviaEmail) {
						StringBuilder corpoEmail = new StringBuilder();
						corpoEmail.append("<html>");
						corpoEmail.append("<head>");
						corpoEmail.append("<title>.:: Web ::.</title>");
						corpoEmail
								.append("<meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'>");
						corpoEmail.append("</head>");
						corpoEmail
								.append("<body bgcolor='#FFFFFF' text='#000000'>");
						corpoEmail
								.append("<table width='100%' border='0' align='center' cellpadding='0' cellspacing='0' height='114' >");
						corpoEmail.append("<tr bgcolor='#FFFFFF'>");
						corpoEmail
								.append("<td width='86%' valign='bottom' height='48'> ");
						corpoEmail.append("<hr noshade color='#000000'>");
						corpoEmail.append("<table border='0' width='100%'>");
						corpoEmail.append("<tr>");
						corpoEmail.append("<td width='100%'>");
						corpoEmail
								.append("<p align='center'><b>PORTAL DE COMPRAS LIBRELATO - ");
						corpoEmail.append(Ferramentas.formataData(
								new Date().getTime(), "dd/MM/yy"));
						corpoEmail.append("</b></p>");
						corpoEmail.append("</td>");
						corpoEmail.append("</tr>");
						corpoEmail.append("</table>");
						corpoEmail.append("<hr noshade color='#000000'>");
						corpoEmail.append("</td>");
						corpoEmail.append("</table>");
						corpoEmail.append("Prezado fornecedor <b>");
						corpoEmail.append(pedido.getFornecedor().getNome()
								.trim());
						corpoEmail.append("</b>,");
//						corpoEmail
//								.append(" existe um novo pedido de compra Nº ");
						//corpoEmail.append(numPedido);
						corpoEmail
						.append(" existe um novo pedido de compra.");
						corpoEmail
								.append(". Acesse o <a href=http://sol.librelato.com.br:8090/SOL/>");
						corpoEmail.append("Portal do Fornecedor</a>");
						corpoEmail.append(" para visualizar.");
						corpoEmail.append("<br>");
						corpoEmail
								.append("Caso você não possua seu código e senha de acesso favor entrar em contato com o departamento de compras.");
						corpoEmail.append("<hr noshade color='#000000'>");
						corpoEmail.append("</body>");
						corpoEmail.append("</html>");
						Ferramentas.enviaEmail(corpoEmail.toString(),
								"Novo Pedido de Compra", pedido.getFornecedor()
										.getEmail(), "COMPRAS");
					}
					pedido = new PedidoBean();
					pedido.setFornecedor(new FornecedorBean());
					pedido.setCondPag(new CondicaoPagamentoBean());
					pedido.setTransportadora(new TransportadoraBean());
					codLojaFornecedor = "";
					filtraSolicitacaoComprador();
					solicitacoesPreSelecionadas = null;
					FacesMessage message = new FacesMessage(
							FacesMessage.SEVERITY_INFO, this.getServico()
									.getValor("msg_header_sucesso"), this
									.getServico()
									.getValor("msg_pedido_incluir"));
					FacesContext.getCurrentInstance().addMessage(null, message);
				} else {
					RequestContext.getCurrentInstance().execute(
							"dlgErroPedido.show()");
				}

			} catch (Exception e) {
				FacesMessage message = new FacesMessage(
						FacesMessage.SEVERITY_ERROR, this.getServico()
								.getValor("msg_header_erro"), this.getServico()
								.getValor("msg_erro_cad_pedido"));
				FacesContext.getCurrentInstance().addMessage(null, message);
				e.printStackTrace();
			}
		} else {

			FacesMessage message = new FacesMessage(
					FacesMessage.SEVERITY_ERROR, this.getServico().getValor(
							"msg_header_erro"), this.getServico().getValor(
							"msg_erro_item"));
			FacesContext.getCurrentInstance().addMessage(null, message);

		}
	}

	public void preparaPedido() {

		List<ProdutoBean> produtos;
		List<SolicitacaoBean> solicitacoes = new ArrayList<SolicitacaoBean>();
		SolicitacaoBean solicitacao;

		for (SolicitacaoBean sol : Arrays
				.asList(this.solicitacoesPreSelecionadas)) {
			for (ProdutoBean produto : sol.getItensSolicitacao()) {
				produtos = new ArrayList<ProdutoBean>();
				produtos.add(produto);
				solicitacao = new SolicitacaoBean();
				solicitacao.setComprador(sol.getComprador());
				solicitacao.setDataAprovacao(sol.getDataAprovacao());
				solicitacao.setDataEmissao(sol.getDataEmissao());
				solicitacao.setFilial(sol.getFilial());
				solicitacao.setHistoricos(sol.getHistoricos());
				solicitacao.setHoraSolicitacao(sol.getHoraSolicitacao());
				solicitacao.setIdSol(sol.getIdSol());
				solicitacao.setItem(produto.getItemPosicao());
				solicitacao.setItensSolicitacao(produtos);
				solicitacao.setNumSolicitacao(sol.getNumSolicitacao());
				solicitacao.setPedido(sol.getPedido());
				solicitacao.setStatus(sol.getStatus());
				solicitacao.setUnidadeRequisi(sol.getUnidadeRequisi());
				solicitacao.setUsuario(sol.getUsuario());
				solicitacoes.add(solicitacao);
			}
		}

		pedido.setSolicitacoesPedido(solicitacoes);
		listaSolicitacaoPedidoModel = new SolicitacaoDataModel(
				pedido.getSolicitacoesPedido());

	}

	public String formataData(Date data, String formato) {
		String dataFormatada = "";
		if (data != null) {
			SimpleDateFormat df = new SimpleDateFormat(formato);
			dataFormatada = df.format(new Date(data.getTime()));
		}
		return dataFormatada;
	}

	public void verificaCampoTipoFrete() {
		if (pedido.getTipoFrete().equals("F")) {
			valFreteReadOnly = false;
		} else {
			valFreteReadOnly = true;
		}
	}

	public String pintaLinha(SolicitacaoBean solicitacao) {
		String classe = "";
		if (solicitacao.getItensSolicitacao().get(0) == null
				|| solicitacao.getItensSolicitacao().get(0).getCentroCusto() == null
				|| solicitacao.getItensSolicitacao().get(0).getCentroCusto()
						.getCodigo() == null
				|| "".equals(solicitacao.getItensSolicitacao().get(0)
						.getCentroCusto().getCodigo())) {
			classe = "blockCheckBox";
		}
		return classe;
	}

	public void validaCampos(FacesContext fc, UIComponent ui, Object objeto) {
		String cod = (String) objeto;
		try {
			if (ui.getId().trim().equals("fornCodPed")) {
				FornecedorServico<FornecedorBean> fornServico = new FornecedorServico<FornecedorBean>();
				fornecedorSel = fornServico.buscaFornecedor(cod);
				if (fornecedorSel != null) {
					fornecedorSel = buscaTabelaPreco(fornecedorSel);
					pedido.setFornecedor(fornecedorSel);
					codLojaFornecedor = pedido.getFornecedor().getCodigo()
							+ pedido.getFornecedor().getLoja();
					fornecedorSel = null;
				} else {
					pedido.getFornecedor().setNome("");
					((UIInput) ui).setValid(false);
					FacesMessage message = new FacesMessage(
							FacesMessage.SEVERITY_ERROR, this.getServico()
									.getValor("msg_header_erro"), this
									.getServico().getValor(
											"msg_erro_fornecedor"));
					FacesContext.getCurrentInstance().addMessage(null, message);
				}
				fornServico = null;
			} else if (ui.getId().trim().equals("condPagPed")) {
				CondicaoPagamentoServico<CondicaoPagamentoBean> condServico = new CondicaoPagamentoServico<CondicaoPagamentoBean>();
				condicaoPagSel = condServico.buscaCondicaoPagamento(cod);
				if (condicaoPagSel != null) {
					pedido.setCondPag(condicaoPagSel);
					condicaoPagSel = null;
				} else {
					pedido.getCondPag().setDescricao("");
					((UIInput) ui).setValid(false);
					FacesMessage message = new FacesMessage(
							FacesMessage.SEVERITY_ERROR, this.getServico()
									.getValor("msg_header_erro"), this
									.getServico().getValor("msg_erro_cond_pag"));
					FacesContext.getCurrentInstance().addMessage(null, message);
				}
				condServico = null;
			} else if (ui.getId().trim().equals("transpPed")) {
				TransportadoraServico<TransportadoraBean> transpServico = new TransportadoraServico<TransportadoraBean>();
				transportadoraSel = transpServico.buscaTransportadoras(cod);
				if (transportadoraSel != null) {
					pedido.setTransportadora(transportadoraSel);
					transportadoraSel = null;
				} else {
					pedido.getTransportadora().setNome("");
					((UIInput) ui).setValid(false);
					FacesMessage message = new FacesMessage(
							FacesMessage.SEVERITY_ERROR, this.getServico()
									.getValor("msg_header_erro"), this
									.getServico().getValor(
											"msg_erro_transportadora"));
					FacesContext.getCurrentInstance().addMessage(null, message);
				}
				transpServico = null;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void onFornecedorSelect(SelectEvent event) {
		fornecedorSel = (FornecedorBean) event.getObject();
		fornecedorSel = buscaTabelaPreco(fornecedorSel);
		pedido.setFornecedor(fornecedorSel);
		codLojaFornecedor = pedido.getFornecedor().getCodigo()
				+ pedido.getFornecedor().getLoja();
		buscaTabelaPreco(fornecedorSel);
		fornecedorSel = null;
	}
	
	public void onFornecedorSelect2(SelectEvent event) {
		fornecedorSel2 = (FornecedorBean) event.getObject();
		fornecedorSel = null;
	}
	
	public void onProdSelect(SelectEvent event) {
		produtoSel = (ProdutoBean) event.getObject();
		buscaHistoricoProdutoPedido(produtoSel);
		produtoSel = null;
	}

	public void onCondicaoPagSelect(SelectEvent event) {
		condicaoPagSel = (CondicaoPagamentoBean) event.getObject();
		pedido.setCondPag(condicaoPagSel);
		condicaoPagSel = null;
	}

	public void onTransportadoraSelect(SelectEvent event) {
		transportadoraSel = (TransportadoraBean) event.getObject();
		pedido.setTransportadora(transportadoraSel);
		transportadoraSel = null;
	}

	public FornecedorBean buscaTabelaPreco(FornecedorBean fornecedor) {
		try {
			TabelaPrecoServico<TabelaPrecoBean> tabelaServico = new TabelaPrecoServico<TabelaPrecoBean>();
			fornecedor.setTabelaPreco(tabelaServico
					.buscaTabelaPreco(fornecedor));
			if (fornecedor.getTabelaPreco() != null) {
				pedido.setCondPag(fornecedor.getTabelaPreco()
						.getCondicaoPagamento());
				listaSolicitacaoPedidoModel = new SolicitacaoDataModel(
						tabelaServico.buscaPrecoItensTabela(fornecedor,
								pedido.getSolicitacoesPedido()));
			}
			tabelaServico = null;
			if (fornecedor.getTabelaPreco() == null) {
				FacesMessage message = new FacesMessage(
						FacesMessage.SEVERITY_WARN, this.getServico().getValor(
								"msg_header_atencao"), this.getServico()
								.getValor("msg_tabela_preco_erro"));
				FacesContext.getCurrentInstance().addMessage(null, message);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return fornecedor;

	}

	public void buscaHistoricoProdutoPedido(ProdutoBean produto) {

		produtoServico = new ProdutoServico<ProdutoBean>();
		StringBuilder sb = new StringBuilder();
		// ProdutoBean produto = solicitacao.getItensSolicitacao().get(0);
		try {
			List<ProdutoBean> listaProdutosAnalise = produtoServico
					.buscaAnaliseProdutoHistoricoPedido(produto);
			sb.append("<tbody>");
			for (ProdutoBean prod : listaProdutosAnalise) {
				sb.append("<tr class='ui-widget-content' role='row'>");
				sb.append("<td role='gridcell'>");
				sb.append(prod.getFilial());
				sb.append("</td>");
				sb.append("<td role='gridcell'>");
				sb.append(prod.getCodigo().trim());
				sb.append("</td>");
				sb.append("<td role='gridcell'>");
				sb.append(prod.getDescricao().trim());
				sb.append("</td>");
				sb.append("<td role='gridcell'>");
				sb.append(prod.getUnidMedida());
				sb.append("</td>");
				sb.append("<td role='gridcell'>");
				sb.append(prod.getSaldoAtual());
				sb.append("</td>");
				sb.append("<td role='gridcell'>");
				sb.append(prod.getPontoPedido());
				sb.append("</td>");
				sb.append("<td role='gridcell'>");
				sb.append(prod.getLoteEconomico());
				sb.append("</td>");
				sb.append("<td role='gridcell'>");
				sb.append(prod.getPreco());
				sb.append("</td>");
				sb.append("</tr>");
			}
			sb.append("</tbody>");
			analiseProdutoHtml = sb.toString();
			geraHtmlConsumoUltmiosMeses(produto);
			buscaUltimasNotasProduto(produto);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private void geraHtmlConsumoUltmiosMeses(ProdutoBean produto)
			throws Exception {

		// ProdutoBean produto = solicitacao.getItensSolicitacao().get(0);
		// produto.setFilial(solicitacao.getFilial());
		String meses[] = { "JAN", "FEV", "MAR", "ABR", "MAI", "JUN", "JUL",
				"AGO", "SET", "OUT", "NOV", "DEZ" };
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(new Date());
		StringBuilder sb = new StringBuilder();
		List<Integer> listaMeses = new ArrayList<Integer>();
		List<Integer> listaAnos = new ArrayList<Integer>();
		calendar.add(Calendar.MONTH, -11);
		listaMeses.add(calendar.get(Calendar.MONTH));
		listaAnos.add(calendar.get(Calendar.YEAR));
		sb.append("<tbody>");
		sb.append("<tr class='ui-widget-header' role='row'>");
		sb.append("<td role='ui-widget-header' role='columnheader'>");
		sb.append(meses[calendar.get(Calendar.MONTH)] + "/"
				+ Ferramentas.formataData(calendar.getTime().getTime(), "yy"));
		sb.append("</td>");
		calendar.add(Calendar.MONTH, +1);
		listaMeses.add(calendar.get(Calendar.MONTH));
		listaAnos.add(calendar.get(Calendar.YEAR));
		sb.append("<td role='ui-widget-header' role='columnheader'>");
		sb.append(meses[calendar.get(Calendar.MONTH)] + "/"
				+ Ferramentas.formataData(calendar.getTime().getTime(), "yy"));
		sb.append("</td>");
		calendar.add(Calendar.MONTH, +1);
		listaMeses.add(calendar.get(Calendar.MONTH));
		listaAnos.add(calendar.get(Calendar.YEAR));
		sb.append("<td role='ui-widget-header' role='columnheader'>");
		sb.append(meses[calendar.get(Calendar.MONTH)] + "/"
				+ Ferramentas.formataData(calendar.getTime().getTime(), "yy"));
		sb.append("</td>");
		calendar.add(Calendar.MONTH, +1);
		listaMeses.add(calendar.get(Calendar.MONTH));
		listaAnos.add(calendar.get(Calendar.YEAR));
		sb.append("<td role='ui-widget-header' role='columnheader'>");
		sb.append(meses[calendar.get(Calendar.MONTH)] + "/"
				+ Ferramentas.formataData(calendar.getTime().getTime(), "yy"));
		sb.append("</td>");
		calendar.add(Calendar.MONTH, +1);
		listaMeses.add(calendar.get(Calendar.MONTH));
		listaAnos.add(calendar.get(Calendar.YEAR));
		sb.append("<td role='ui-widget-header' role='columnheader'>");
		sb.append(meses[calendar.get(Calendar.MONTH)] + "/"
				+ Ferramentas.formataData(calendar.getTime().getTime(), "yy"));
		sb.append("</td>");
		calendar.add(Calendar.MONTH, +1);
		listaMeses.add(calendar.get(Calendar.MONTH));
		listaAnos.add(calendar.get(Calendar.YEAR));
		sb.append("<td role='ui-widget-header' role='columnheader'>");
		sb.append(meses[calendar.get(Calendar.MONTH)] + "/"
				+ Ferramentas.formataData(calendar.getTime().getTime(), "yy"));
		sb.append("</td>");
		calendar.add(Calendar.MONTH, +1);
		listaMeses.add(calendar.get(Calendar.MONTH));
		listaAnos.add(calendar.get(Calendar.YEAR));
		sb.append("<td role='ui-widget-header' role='columnheader'>");
		sb.append(meses[calendar.get(Calendar.MONTH)] + "/"
				+ Ferramentas.formataData(calendar.getTime().getTime(), "yy"));
		sb.append("</td>");
		calendar.add(Calendar.MONTH, +1);
		listaMeses.add(calendar.get(Calendar.MONTH));
		listaAnos.add(calendar.get(Calendar.YEAR));
		sb.append("<td role='ui-widget-header' role='columnheader'>");
		sb.append(meses[calendar.get(Calendar.MONTH)] + "/"
				+ Ferramentas.formataData(calendar.getTime().getTime(), "yy"));
		sb.append("</td>");
		calendar.add(Calendar.MONTH, +1);
		listaMeses.add(calendar.get(Calendar.MONTH));
		listaAnos.add(calendar.get(Calendar.YEAR));
		sb.append("<td role='ui-widget-header' role='columnheader'>");
		sb.append(meses[calendar.get(Calendar.MONTH)] + "/"
				+ Ferramentas.formataData(calendar.getTime().getTime(), "yy"));
		sb.append("</td>");
		calendar.add(Calendar.MONTH, +1);
		listaMeses.add(calendar.get(Calendar.MONTH));
		listaAnos.add(calendar.get(Calendar.YEAR));
		sb.append("<td role='ui-widget-header' role='columnheader'>");
		sb.append(meses[calendar.get(Calendar.MONTH)] + "/"
				+ Ferramentas.formataData(calendar.getTime().getTime(), "yy"));
		sb.append("</td>");
		calendar.add(Calendar.MONTH, +1);
		listaMeses.add(calendar.get(Calendar.MONTH));
		listaAnos.add(calendar.get(Calendar.YEAR));
		sb.append("<td role='ui-widget-header' role='columnheader'>");
		sb.append(meses[calendar.get(Calendar.MONTH)] + "/"
				+ Ferramentas.formataData(calendar.getTime().getTime(), "yy"));
		sb.append("</td>");
		calendar.add(Calendar.MONTH, +1);
		listaMeses.add(calendar.get(Calendar.MONTH));
		listaAnos.add(calendar.get(Calendar.YEAR));
		sb.append("<td role='ui-widget-header' role='columnheader'>");
		sb.append(meses[calendar.get(Calendar.MONTH)] + "/"
				+ Ferramentas.formataData(calendar.getTime().getTime(), "yy"));
		sb.append("</td>");
		sb.append("</tr>");
		sb.append("</tbody>");

		Map<Integer, Double> totalMeses = produtoServico.buscaConsumoProduto(
				produto, listaMeses, listaAnos);

		sb.append("<tbody>");
		sb.append("<tr class='ui-widget-content' role='row'>");
		sb.append("<td role='gridcell'>");
		sb.append(totalMeses.get(listaMeses.get(11)));
		sb.append("</td>");
		sb.append("<td role='gridcell'>");
		sb.append(totalMeses.get(listaMeses.get(10)));
		sb.append("</td>");
		sb.append("<td role='gridcell'>");
		sb.append(totalMeses.get(listaMeses.get(9)));
		sb.append("</td>");
		sb.append("<td role='gridcell'>");
		sb.append(totalMeses.get(listaMeses.get(8)));
		sb.append("</td>");
		sb.append("<td role='gridcell'>");
		sb.append(totalMeses.get(listaMeses.get(7)));
		sb.append("</td>");
		sb.append("<td role='gridcell'>");
		sb.append(totalMeses.get(listaMeses.get(6)));
		sb.append("</td>");
		sb.append("<td role='gridcell'>");
		sb.append(totalMeses.get(listaMeses.get(5)));
		sb.append("</td>");
		sb.append("<td role='gridcell'>");
		sb.append(totalMeses.get(listaMeses.get(4)));
		sb.append("</td>");
		sb.append("<td role='gridcell'>");
		sb.append(totalMeses.get(listaMeses.get(3)));
		sb.append("</td>");
		sb.append("<td role='gridcell'>");
		sb.append(totalMeses.get(listaMeses.get(2)));
		sb.append("</td>");
		sb.append("<td role='gridcell'>");
		sb.append(totalMeses.get(listaMeses.get(1)));
		sb.append("</td>");
		sb.append("<td role='gridcell'>");
		sb.append(totalMeses.get(listaMeses.get(0)));
		sb.append("</td>");
		sb.append("</tr>");

		sb.append("</tbody>");

		consumoUltimosMesesHtml = sb.toString();
	}

	private void buscaUltimasNotasProduto(ProdutoBean produto) throws Exception {
		notaFiscalServico = new NotaFiscalEntradaServico<NotaFiscalEntradaBean>();
		listaUltimasNotasProduto = notaFiscalServico
				.buscaUltimasNotasProduto(produto);
		notaFiscalServico = null;

	}

	public String formataNumero(Double numero, String formato) {

		String valor = "";
		try {
			DecimalFormat df = new DecimalFormat(formato);
			valor = df.format(numero);
		} catch (Exception e) {
			e.printStackTrace();
		}

		return valor;

	}

	public void bloquearSolicitacao() {
		try {
			if (itensSelecionados.length > 0) {
				solicitacao.setItensSolicitacao(Arrays
						.asList(itensSelecionados));
				solicitacao.setComprador(usuario.getComprador());
				this.solicitacaoServico.bloqueiaSolicitacao(solicitacao);
				for (int i = 0; i < solicitacao.getItensSolicitacao().size(); i++) {
					solicitacao.getItensSolicitacao().get(i).setObservacao("");
				}
				this.solicitacaoServico
						.insereHistorico(solicitacao, "Solicitação Bloqueada");
				FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO,
						this.solicitacaoServico.getValor("msg_header_sucesso"),
						this.solicitacaoServico.getValor("msg_bloq_sol"));
				FacesContext.getCurrentInstance().addMessage(null, msg);
				filtraSolicitacaoComprador();
				itensSelecionados = null;
			} else {
				FacesMessage msg = new FacesMessage(
						FacesMessage.SEVERITY_ERROR,
						this.solicitacaoServico.getValor("msg_header_erro"),
						this.solicitacaoServico.getValor("msg_erro_item"));
				FacesContext.getCurrentInstance().addMessage(null, msg);
			}
		} catch (Exception e) {
			FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR,
					this.solicitacaoServico.getValor("msg_header_erro"),
					this.solicitacaoServico
							.getValor("msg_bloq_solicita_erro"));
			FacesContext.getCurrentInstance().addMessage(null, msg);
			e.printStackTrace();
		}
	}
	
	public void preencheListModel(SolicitacaoBean solicitacao) {
		this.solicitacao = solicitacao;
		itensSolicitacaoBloquear = new ProdutoDataModel(this.solicitacao.getItensSolicitacao());
	}
	
	@SuppressWarnings("rawtypes")
	@Override
	protected IServicoGenerico getServico() {
		return this.pedidoServico;
	}

	public UsuarioBean getUsuario() {
		return usuario;
	}

	public void setUsuario(UsuarioBean usuario) {
		this.usuario = usuario;
	}

	public PedidoServico<PedidoBean> getPedidoServico() {
		return pedidoServico;
	}

	public void setPedidoServico(PedidoServico<PedidoBean> pedidoServico) {
		this.pedidoServico = pedidoServico;
	}

	public SolicitacaoServico<SolicitacaoBean> getSolicitacaoServico() {
		return solicitacaoServico;
	}

	public void setSolicitacaoServico(
			SolicitacaoServico<SolicitacaoBean> solicitacaoServico) {
		this.solicitacaoServico = solicitacaoServico;
	}

	public String getDataDe() {
		return dataDe;
	}

	public void setDataDe(String dataDe) {
		this.dataDe = dataDe;
	}

	public String getDataAte() {
		return dataAte;
	}

	public void setDataAte(String dataAte) {
		this.dataAte = dataAte;
	}

	public String getNumSolicitacao() {
		return numSolicitacao;
	}

	public void setNumSolicitacao(String numSolicitacao) {
		this.numSolicitacao = numSolicitacao;
	}

	public String getCodProd() {
		return codProd;
	}

	public void setCodProd(String codProd) {
		this.codProd = codProd;
	}

	public String getFilial() {
		return filial;
	}

	public void setFilial(String filial) {
		this.filial = filial;
	}

	public Map<String, String> getParametros() {
		return parametros;
	}

	public void setParametros(Map<String, String> parametros) {
		this.parametros = parametros;
	}

	public List<SolicitacaoBean> getListaSolicitacao() {
		return listaSolicitacao;
	}

	public void setListaSolicitacao(List<SolicitacaoBean> listaSolicitacao) {
		this.listaSolicitacao = listaSolicitacao;
	}

	public SolicitacaoDataModel getListaSolicitacaoModel() {
		return listaSolicitacaoModel;
	}

	public void setListaSolicitacaoModel(
			SolicitacaoDataModel listaSolicitacaoModel) {
		this.listaSolicitacaoModel = listaSolicitacaoModel;
	}

	public List<ProdutoBean> getItensSolicitacao() {
		return itensSolicitacao;
	}

	public void setItensSolicitacao(List<ProdutoBean> itensSolicitacao) {
		this.itensSolicitacao = itensSolicitacao;
	}

	public SolicitacaoBean getSolicitacao() {
		return solicitacao;
	}

	public void setSolicitacao(SolicitacaoBean solicitacao) {
		this.solicitacao = solicitacao;
	}

	public SolicitacaoBean[] getSolicitacoesPreSelecionadas() {
		return solicitacoesPreSelecionadas;
	}

	public void setSolicitacoesPreSelecionadas(
			SolicitacaoBean[] solicitacoesPreSelecionadas) {
		this.solicitacoesPreSelecionadas = solicitacoesPreSelecionadas;
	}

	public PedidoBean getPedido() {
		return pedido;
	}

	public void setPedido(PedidoBean pedido) {
		this.pedido = pedido;
	}

	public SolicitacaoDataModel getListaSolicitacaoPedidoModel() {
		return listaSolicitacaoPedidoModel;
	}

	public void setListaSolicitacaoPedidoModel(
			SolicitacaoDataModel listaSolicitacaoPedidoModel) {
		this.listaSolicitacaoPedidoModel = listaSolicitacaoPedidoModel;
	}

	public boolean isValFreteReadOnly() {
		return valFreteReadOnly;
	}

	public void setValFreteReadOnly(boolean valFreteReadOnly) {
		this.valFreteReadOnly = valFreteReadOnly;
	}

	public SolicitacaoBean[] getSolicitacoesSelecionadasPedido() {
		return solicitacoesSelecionadasPedido;
	}

	public void setSolicitacoesSelecionadasPedido(
			SolicitacaoBean[] solicitacoesSelecionadasPedido) {
		this.solicitacoesSelecionadasPedido = solicitacoesSelecionadasPedido;
	}

	public String getNumPedido() {
		return numPedido;
	}

	public void setNumPedido(String numPedido) {
		this.numPedido = numPedido;
	}

	public FornecedorBean getFornecedorSel() {
		return fornecedorSel;
	}

	public void setFornecedorSel(FornecedorBean fornecedorSel) {
		this.fornecedorSel = fornecedorSel;
	}

	public CondicaoPagamentoBean getCondicaoPagSel() {
		return condicaoPagSel;
	}

	public void setCondicaoPagSel(CondicaoPagamentoBean condicaoPagSel) {
		this.condicaoPagSel = condicaoPagSel;
	}

	public TransportadoraBean getTransportadoraSel() {
		return transportadoraSel;
	}

	public void setTransportadoraSel(TransportadoraBean transportadoraSel) {
		this.transportadoraSel = transportadoraSel;
	}

	public String getCodLojaFornecedor() {
		return codLojaFornecedor;
	}

	public void setCodLojaFornecedor(String codLojaFornecedor) {
		this.codLojaFornecedor = codLojaFornecedor;
	}

	public ProdutoServico<ProdutoBean> getProdutoServico() {
		return produtoServico;
	}

	public void setProdutoServico(ProdutoServico<ProdutoBean> produtoServico) {
		this.produtoServico = produtoServico;
	}

	public String getAnaliseProdutoHtml() {
		return analiseProdutoHtml;
	}

	public void setAnaliseProdutoHtml(String analiseProdutoHtml) {
		this.analiseProdutoHtml = analiseProdutoHtml;
	}

	public String getConsumoUltimosMesesHtml() {
		return consumoUltimosMesesHtml;
	}

	public void setConsumoUltimosMesesHtml(String consumoUltimosMesesHtml) {
		this.consumoUltimosMesesHtml = consumoUltimosMesesHtml;
	}

	public List<NotaFiscalEntradaBean> getListaUltimasNotasProduto() {
		return listaUltimasNotasProduto;
	}

	public void setListaUltimasNotasProduto(
			List<NotaFiscalEntradaBean> listaUltimasNotasProduto) {
		this.listaUltimasNotasProduto = listaUltimasNotasProduto;
	}

	public NotaFiscalEntradaServico<NotaFiscalEntradaBean> getNotaFiscalServico() {
		return notaFiscalServico;
	}

	public void setNotaFiscalServico(
			NotaFiscalEntradaServico<NotaFiscalEntradaBean> notaFiscalServico) {
		this.notaFiscalServico = notaFiscalServico;
	}

	public boolean isCheckEnviaEmail() {
		return checkEnviaEmail;
	}

	public void setCheckEnviaEmail(boolean checkEnviaEmail) {
		this.checkEnviaEmail = checkEnviaEmail;
	}

	public FornecedorBean getFornecedorSel2() {
		return fornecedorSel2;
	}

	public void setFornecedorSel2(FornecedorBean fornecedorSel2) {
		this.fornecedorSel2 = fornecedorSel2;
	}

	public ProdutoBean getProdutoSel() {
		return produtoSel;
	}

	public void setProdutoSel(ProdutoBean produtoSel) {
		this.produtoSel = produtoSel;
	}

	public ProdutoBean[] getItensSelecionados() {
		return itensSelecionados;
	}

	public void setItensSelecionados(ProdutoBean[] itensSelecionados) {
		this.itensSelecionados = itensSelecionados;
	}

	public ProdutoDataModel getItensSolicitacaoBloquear() {
		return itensSolicitacaoBloquear;
	}

	public void setItensSolicitacaoBloquear(
			ProdutoDataModel itensSolicitacaoBloquear) {
		this.itensSolicitacaoBloquear = itensSolicitacaoBloquear;
	}
	

}
